17971
306
Eu tenho um controle de usuário personalizado e estou tentando definir algumas de suas propriedades com o designer. As propriedades virão de uma estrutura. Aqui está o código atual
FooList privada como estrutura_foo
Estrutura Pública Foo_structure
Propriedade pública como número inteiro
Propriedade pública b como inteiro
Propriedade Pública c Como Extras
Estrutura Final
Extras de estrutura pública
Precisão de propriedade pública como inteiro
Luz de propriedade pública como string
Estrutura Final
Propriedade pública foo Como Foo_structure
Pegue
Retornar fooList
End Get
Definir (valor ByVal As Foo_structure)
fooList = value
End Set
Propriedade Final
Eu preciso ser capaz de definir as propriedades de Foo_structure no painel de propriedades do designer, como mostrado na imagem abaixo. 
Você vai precisar de um TypeConverter para recolher foo em uma string; e converter de volta a partir dele. O tipo aninhado significa que você precisa escrever outro para Extras. Você provavelmente precisará usar alguns atributos para lidar com a persistência do designer.
Para começar, acho que você precisa alterar pelo menos Foo_structure para uma classe, caso contrário, não há como adicionar código à instância Extras (também não há como criar uma instância Foo). Isso deve ajudá-lo a começar (mudou alguns nomes):
'Foo convertido em classe:

FooBar de classe pública


Propriedade pública Foo As Integer


Barra de propriedade pública como número inteiro



Propriedade Pública Ex como Extras
Public Sub New (a1 como inteiro, b2 como inteiro)
Foo = a1
Bar = b2
Ex = Novos Extras 'não quero NADA voando por aí
End Sub
Fim da aula
DefaultValue não faz o que você pensa que faz. Diz ao IDE para serializar o valor de uma propriedade quando o valor atual não for igual ao Padrão. DesignerSerializationVisibility diz ao VS para salvar o valor de uma propriedade. Foo e Bar precisam disso.
Ex / Extra é diferente. NotifyParentProperty permite que FooBar seja notificado quando um valor de propriedade Extra for alterado para que a janela IDE seja atualizada, conjunto interno "DirtyFlag" etc; DesignerSerializationVisibility.Content diz ao VS que sabemos que não podemos salvar Ex como um valor, então salve o conteúdo.
Em seguida, vem o FooItemConverter. Isso será o que exibirá a string que você deseja na janela Props E criará um item Foo a partir dessa string:
Friend Class FooItemConverter
Herda ExpandableObjectConverter
'diz ao IDE quais conversões ele pode manipular:
Função de substituições públicas CanConvertTo (context As ITypeDescriptorContext,
destType As Type) As Boolean
If destType = GetType (String) Then
' Sim eu posso
Retorno Verdadeiro
Fim se
'Provavelmente também terá que dizer SIM para um InstanceDescriptor
Retornar MyBase.CanConvertTo (context, destType)
Função Final
Depois disso, uma função ConvertTo é usada para converter foo em uma string. Algo assim:
Função de substituições públicas ConvertTo (context As ITypeDescriptorContext,
cultura As Globalization.CultureInfo,
valor As Object, destType As Type) As Object
If destType = GetType (String) Then
Dim f As FooBar = CType (valor, FooBar)
Return String.Format ("{0}, {1}, {2}",
f.foo.ToString,
f.bar.ToString,
f.Ex.ToString)
'saídas: X, Y, 
'onde Ex é o que usamos no ExtraItemConverter
Fim se
Retornar MyBase.ConvertTo (context, destType)
Função Final
Se ExtraItemConverter.ConvertTo usar um formato de "({0} / {1})", o conteúdo do controle será mostrado como: F, B, (P / L) onde F = Foo, B = Bar etc.
Para fazer isso funcionar, você precisa de 4 procedimentos: CanConvertTo, ConvertTo, CanConvertFrom, ConvertFrom, todos respondendo a string. Você provavelmente será capaz de usar apenas o atributo  para persistência.
FooItemConverter.ConvertFrom terá que saber como criar um objeto a partir dessa string. Normalmente, isso é feito assim:
'analise a string que você fez e crie um Foo
Dim els As String () = str.Split ("," c)
Return New myFoo (Convert.ToInt32 (els (0)), Convert.ToInt32 (els (1)))
Observe que o terceiro elemento é ignorado, pois é, na verdade, para o ExtraItemConverter manipular. Esse conversor seria muito semelhante.
Portanto, primeiro você terá que decidir se deseja se apegar à estrutura ou usar uma classe (outro profissional para uma classe é que 99,999% dos exemplos que você encontrar serão baseados em classes). Esses caras sabem muito sobre TypeConverters.
|
sua resposta
StackExchange.ifUsing ("editor", function () {
StackExchange.using ("externalEditor", function () {
StackExchange.using ("snippets", function () {
StackExchange.snippets.init ();
});
});
}, "partes de codigo");
StackExchange.ready (function () {
var channelOptions = {
tags: "" .split (""),
id: "1"
};
initTagRenderer ("". split (""), "" .split (""), channelOptions);
StackExchange.using ("externalEditor", function () {
// Tem que disparar o editor após os snippets, se os snippets estiverem habilitados
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ("snippets", function () {
createEditor ();
});
}
outro {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor: false,
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputaçãoToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.2645446,2665 7,94324 47,1084 7,58816C47.4091 7,46349 47,7169 7,36433 48,0099 7,26993C48.9099 6,97997 49,672 6,73443 49,672 5,93063C49,672 5,22043 48,9832 4,61182 48,1414 4,61182C47,4335 4,26993C48.9099 6,97997 49,672 6,73443 49,672 5,93063C49,672 5,22043 48,9832 4,61182 48,1414 4,61182C47,4335 4,6431182 4,25.654,23,7623,74,6281 4,9281 467823,621 4,96281 4,9823,623,623,461,45,023,74,6281 4,9823,1623,623,14,6281 4,9282 C 4,9281 4,923,623,623,76,2 53,76,23,76,823,14,65,0281 4,928,023,623,14,65,0281 4,928,023,623. 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1439219 C32.492.492. 41,5985 12,6954 41,5985 10.1419V6.59049C41.5985 5,28821 41,1394 4,66232 40,1061 4.66232C39.0732 4,66232 38,5948 5,28821 38,5948 6.59049V9.60062C38.5948 10,8521 38,2696 11,5455 37,0451 11.5455C35.8209 11,5455 35,4954 10,8521 35,4954 9.60062V6.59049C35.4954 5,28821 35,0173 4,66232 34,0034 4,66232 C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \" M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 3 0,2537 15.6379C30.8468 14,7755 30,9615 13,5579 30,9615 11.9512V6.59049C30.9615 5,28821 30,4833 4,66231 29,4502 4.66231C28.9913 4,66231 28,4555 4,94978 28,1109 5.50789C27.499 4,86533 26,7335 4,56087 25,7005 4.56087C23.1369 4,56087 21,0134 6,57349 21,0134 9.27932C21.0134 11,9852 23,003 13,913 25.3754 13.913C26.5612 13,913 27.4607 13,4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.437373 27.2502 C28.161.5612.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.437373 27.2502 C28.131.518.5612.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.437373 27.2502 C28.131.518.518.518.273.114.518.514.518.514.518.214.514.514.518.514.518.214.514.514.514.518.514.518.214.514.518.514.518.214.518.254.514.514.518.514.518.254. C21.7977 14,5218 21,2429 15,0123 21,2429 15.6887C21.2429 16,7375 22,9072 17,6335 25,6622 17.6335ZM24.1317 9.27932C24.1317 7,94324 24,9928 7,09766 26,1024 7.09766C27.2119 7,09766 28,0918 7,94324 28,0918 9.27932C28.0918 10,6321 27,2311 11,5116 26,1024 11.5116C24.9737 11,5116 24,1317 10,6491 24,1317 9,27932Z \ "/ \ u003e \ u003cpath d = \" M16,8045 11,9512C16,8045 13,2535 17,2637 13,8962 18,2965 13,8962C19,3298 13,8962 19,8079 13,2535 19,8079 11.9512V8.12928C19.8079 5,82936 18,4879 4,62866 16,4027 4.62866C15.1594 4,62866 14,279 4,98375 13,3609 5.88013C12.653 5,05154 11,6581 4,62866 10,3573 4.62866C9.34336 4,62866 8,57809 4,89931 7,9466 5.5079C7.58314 4,9328 7,10506 4,66232 6,51203 4,66232 4.66232C5.47873 5,00066 5,28821 5,00066 6.59049V11.9512C5.00066 13,2535 5,47873 13,8962 6,51203 13.8962C7.54479 13,8962 8,0232 13,2535 8,0232 11.9512V8.90741C8.0232 7,58817 8,44431 6,91179 9,53458 6.91179C10.5104 6,91179 10,893 7,58817 10,893 8.94108V11.9512C10.893 13,2535 11,3711 13,8962 12,4044 13,8962 C13,4375 13,8962 13,9157 13,2535 13,9157 11,9512V8.90741C13,9157 7,58817 14,3365 6,91179 15,4269 6,91179C16.4027 6,91179 16,8045 7,58817 16,8045 8,94108V11.9512Z \ "/ \ u003e \ u003 6,91179 15,4269 6,91179C16.4027 6,91179 16,8045 7,58817 16,8045 8,94108V11.9512Z \" / \ u003e \ u003 6,56cpath216.663753,76,36,36 6,56 cpath2166 "5,566 866 8168" 6,566 d16816 "28668168,36 8166 866 816 866 8168 6,56 866 8168 6,56 866 8168 6,566 816 866 8168 cpath2168166 8166 866 8168 6,566 816 866 816 866 816 866 8168 6,56 866 816 8 6 6 8 cpath216; 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.857988962 3.31675 13.2535 3.31675 11,9512V6.59049Z \ "/ \ u003e \ u003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 0 1.98861E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml: "Contribuições do usuário licenciadas sob \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (política de conteúdo) \ u003c / a \ u003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
, imediatamenteShowMarkdownHelp: true, enableTables: true, enableSnippets: true
});
}
});
Obrigado por contribuir com uma resposta para Stack Overflow!
Certifique-se de responder à pergunta. Forneça detalhes e compartilhe sua pesquisa!
Mas evite ...
Pedir ajuda, esclarecimento ou responder a outras respostas.
Fazer declarações com base em opinião; apoie-os com referências ou experiência pessoal.
Para saber mais, veja nossas dicas sobre como escrever boas respostas.
Rascunho salvo
Rascunho descartado
Cadastre-se ou faça o login
StackExchange.ready (function () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Inscreva-se usando o Google
Cadastre-se usando o Facebook
Inscreva-se usando e-mail e senha
Enviar
Postar como convidado
Nome
O email
Obrigatório, mas nunca mostrado
StackExchange.ready (
function () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f24241527% 2fvb-net-setting-properties-of-user-control% 23new-answer', ' question_page ');
}
);
Postar como convidado
Nome
O email
Obrigatório, mas nunca mostrado
Publique a sua resposta
Descartar
Ao clicar em “Publique sua resposta”, você concorda com nossos termos de serviço, política de privacidade e política de cookies
Não é a resposta que você está procurando? Navegue por outras questões com as tags de propriedades vb.net ou faça sua própria pergunta.